﻿#define _CRT_SECURE_NO_WARNINGS 1

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>




//编号=地址=指针
//int main()
//{
//	int a = 90;
//	int* pa = &a;
//	*pa = 19;
//	printf("%d\n", a);
//	return 0;
//}


//九九乘法表
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 1; j <= i; j++)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}




//模拟冒泡排序，排序通用类型的变量

//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//
//
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
//
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//
//
//void swap(char* buf1, char* buf2, size_t sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		char tmp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
//
//void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
//			{
//				//交换每个字节的内容
//				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
//			}
//		}
//	}
//}
//
//
//void test1()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//
//
//int main()
//{
//	//test1();
//	struct Stu s[] = { {"zhangsan",29},{"lisi",39},{"wangwu",10}};
//	size_t sz = sizeof(s) / sizeof(s[0]);
//	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//
//	return 0;
//}



//memmove

//void* my_memmove(void* dest, const void* src, size_t size)
//{
//	assert(dest && src);
//	void* ret = dest;
//	if (dest < src)
//	{
//		int i = 0;
//		for (i = 0; i < size; i++)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else
//	{
//		while (size--)
//		{
//			*((char*)dest + size) = *((char*)src + size);
//		}
//	}
//	return ret;
//}
//
//
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr + 2, arr, 20);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}




//模拟atoi

//enum
//{
//	INVALID,
//	VALID
//}sta=INVALID;
//
//
//int my_atoi(const char* str)
//{
//	//1.空指针
//	assert(str);
//	//2.空字符串
//	if (*str == '\0')
//	{
//		return 0;
//	}
//	//3.空格
//	while (isspace(*str))
//	{
//		str++;
//	}
//	//4.+-
//	int flag = 1;
//	if (*str == '+')
//	{
//		flag = 1;
//		str++;
//	}
//	else if (*str == '-')
//	{
//		flag = -1;
//		str++;
//	}
//	//......
//	//正常情况
//	long long r = 0;
//	while (*str)
//	{
//		if (isdigit(*str))
//		{
//			r = r * 10 + flag * (*str - '0');
//			if (r > 2147483647 || r < -2147483647)
//			{
//				if (flag == 1)
//				{
//					return 2147483647;
//				}
//				else
//				{
//					return - 2147483647;
//				}
//			}
//			str++;
//		}
//		else
//		{
//			return (int)r;
//		}
//	}
//	sta = VALID;
//	return (int)r;
//}
//
//
//
//int main()
//{
//	//char arr[] = "abdaho939999848";
//	//char arr[] = "      939999848";
//	//char arr[] = "abdaho  939999848";
//	//char arr[] = "3939839333333333939999848";
//	//char arr[] = "-11111111111111111111111111111";
//	//char arr[] = "19393";
//	//char arr[] = "-198383agjdd";
//	
//	int ret = my_atoi(arr);
//
//	if (sta == VALID)
//	{
//		printf("合法的转换: %d\n", ret);
//	}
//	else
//	{
//		printf("非法的转换: %d\n", ret);
//	}
//	
//	return 0;
//}



//寻找单身狗

//void Find_single_dog2(int* arr, size_t sz)
//{
//	//1.全部异或在一起
//	int i = 0;
//	int r = 0;
//	for (i = 0; i < sz; i++)
//	{
//		r ^= arr[i];
//	}
//	//2.分组
//	int pos = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((r >> i) & 1) == 1)
//		{
//			pos = i;
//			break;
//		}
//	}
//	//3.分别异或
//	int s1 = 0;
//	int s2 = 0;
//	for (i = 0; i < sz; i++)
//	{
//		if (((arr[i] >> pos) & 1) == 1)
//		{
//			s1 ^= arr[i];
//		}
//		else
//		{
//			s2 ^= arr[i];
//		}
//	}
//
//	printf("%d %d",s1,s2);
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	Find_single_dog2(arr, sz);
//
//	return 0;
//}


//函数指针，回调函数
//void menu()
//{
//	printf("****************************************\n");
//	printf("****       1.add        2.sub       ****\n");
//	printf("****       3.mul        4.div       ****\n");
//	printf("****              0.exit            ****\n");
//	printf("****************************************\n");
//}
//
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void calc(int(*pf)(int, int))
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int ret = pf(x, y);
//	printf("%d\n", ret);
//}
//
//
//int main()
//{
//	int input = 0;
//	do
//	{
//		menu();
//		printf("请选择>:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:calc(Add);
//			break;
//		case 2:calc(Sub);
//			break;
//		case 3:calc(Mul);
//			break;
//		case 4:calc(Div);
//			break;
//		case 0:printf("退出计算机\n");
//			break;
//		default:printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}



//函数指针数组
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int(*pfarr[4])(int, int) = { Add,Sub,Mul,Div };
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int i = 0;
//	for (i = 0; i < 4; i++)
//	{
//		printf("%d\n", pfarr[i](x,y));
//	}
//	return 0;
//}



//二分查找
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	int k = 0;
//	printf("请输入你要查找的数字\n");
//	scanf("%d", &k);
//	int flag = 0;
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (*(arr + mid) < k)
//		{
//			right = mid - 1;
//		}
//		else if (*(arr + mid) > k)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			flag = 1;
//			printf("找到了，下标是%d\n", mid);
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}



//struct Stu
//{
//	char c;
//	int i;
//	double d;
//};
//
//#define  SWAP_BIT(n)   (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
//
//#define OFFSETOF(type,name)    (size_t)&(((type*)0)->name)
//
//int main()
//{
//	////printf("%zd\n", sizeof(struct Stu));
//	//int n = 0;
//	//scanf("%d", &n);
//
//	//printf("%d\n", SWAP_BIT(n));
//
//
//	printf("%zd\n", OFFSETOF(struct Stu, c));
//	printf("%zd\n", OFFSETOF(struct Stu, i));
//	printf("%zd\n", OFFSETOF(struct Stu, d));
//	return 0;
//}


//编号=地址=指针
//int main()
//{
//	int a = 0;
//	int* pa = &a;
//	*pa = 18;
//	printf("%d", a);
//	return 0;
//}


//逆置字符串

//void reverse(char* str, size_t sz)
//{
//	size_t left = 0;
//	size_t right = sz - 2;
//	while (left < right)
//	{
//		char tmp = *(str + left);
//		*(str + left) = *(str + right);
//		*(str + right) = tmp;
//		left++;
//		right--;
//	}
//}
//
//int main()
//{
//	char arr[] = "abcdefghijklmn";
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	reverse(arr, sz);
//	printf("%s\n", arr);
//	return 0;
//}


//冒泡排序
//void swap(int* n1, int* n2)
//{
//	int tmp = *n1;
//	*n1 = *n2;
//	*n2 = tmp;
//}
//
//void bubble_sort(int* arr, size_t sz)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int exchange = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (*(arr + j) > *(arr + j + 1))
//			{
//				exchange = 1;
//				swap(arr + j, arr + j + 1);
//			}	
//		}
//		if (exchange == 0)
//		{
//			break;
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}




//二分查找
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	int k = 0;
//	printf("请输入你要查找的数字\n");
//	scanf("%d", &k);
//	int flag = 0;
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (*(arr + mid) < k)
//		{
//			right = mid - 1;
//		}
//		else if (*(arr + mid) > k)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			printf("找到了，下标是%d\n", mid);
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}



//指针数组
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6 };
//	int arr2[] = { 2,3,4,5,6,7 };
//	int arr3[] = { 3,4,5,6,7,8 };
//	int arr4[] = { 4,5,6,7,8,9 };
//	int* arr[] = { arr1,arr2,arr3,arr4 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 4; i++)
//	{
//		for (j = 0; j < 6; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}




//字符串相关函数
//strchr


//char* my_strchr(const char* str, int character)
//{
//	assert(str);
//	while (*str)
//	{
//		if (*str == character)
//		{
//			return (char*)str;
//		}
//		++str;
//	}
//	return NULL;
//}
//
//
////strlen
//
//int my_strlen(const char* str)
//{
//	assert(str);
//	int count = 0;
//	while (*str++ != '\0')
//	{
//		count++;
//	}
//	return count;
//}
//
//
////strcpy
//
//
//char* my_strcpy(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//
////strcmp
//
//
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//		str1++;
//		str2++;
//	}
//	if (*str1 > *str2)
//		return 1;
//	else
//		return -1;
//
//}
//
//
////strcat
//
//
//char* my_strcat(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//	while (*dest != '\0')
//	{
//		dest++;
//	}
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//
//}
//
////strstr
//
//
//char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	const char* s1 = str1;
//	const char* s2 = str2;
//	const char* p = str1;
//	while (*p != '\0')
//	{
//		s1 = p;
//		s2 = str2;
//		while (*s1 && *s2 && *s1 == *s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//		{
//			return (char*)p;
//		}
//		p++;
//	}
//	return NULL;
//}
//
//
//
//int main()
//{
//	char arr1[30] = "abcdefghijklmn";
//	char arr2[] = "defghijkl";
//	//printf("%s\n", my_strchr(arr1, 'g'));
//	//printf("%d\n", my_strlen(arr1));
//	//printf("%s\n", my_strcpy(arr1, arr2));
//	//printf("%d\n", my_strcmp(arr1, arr2));
//	//printf("%s\n", my_strcat(arr1, arr2));
//	printf("%s\n", my_strstr(arr1, arr2));
//	return 0;
//}





//内存函数
//memmove


//void* my_memmove(void* dest, const void* src, size_t sz)
//{
//	assert(dest && src);
//	void* ret = dest;
//	if (dest < src)
//	{
//		int i = 0;
//		for (i = 0; i < sz; i++)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else
//	{
//		while (sz--)
//		{
//			*((char*)dest + sz) = *((char*)src + sz);
//		}
//	}
//	return ret;
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	memmove(arr + 2, arr, 20);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}


//函数指针，回调函数

//void menu()
//{
//	printf("*****************************************\n");
//	printf("*****      1.add         2.sub      *****\n");
//	printf("*****      3.mul         4.div      *****\n");
//	printf("*****             0.exit            *****\n");
//	printf("*****************************************\n");
//
//}
//
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//void calc(int(*pf)(int, int))
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int ret = pf(x, y);
//	printf("%d\n", ret);
//}
//
//
//int main()
//{
//	int input = 0;
//	do
//	{
//		menu();
//		printf("请选择>:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:calc(Add);
//			break;
//		case 2:calc(Sub);
//			break;
//		case 3:calc(Mul);
//			break;
//		case 4:calc(Div);
//			break;
//		case 0:printf("退出计算机\n");
//			break;
//		default:printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}


//函数指针数组
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int(*pfarr[4])(int, int) = { Add,Sub,Mul,Div };
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	
//
//	int i = 0;
//
//	for (i = 0; i < 4; i++)
//	{
//		printf("%d\n", pfarr[i](x,y));
//	}
//	return 0;
//}




//模拟冒泡排序，排序通用类型

//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
//
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//
//
//void swap(char* buf1, char* buf2, size_t size)
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		char tmp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
//
//void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int exchange = 0;
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
//			{
//				exchange = 1;
//				//交换每个字节的内容
//				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
//			}
//		}
//		if (exchange == 0)
//			break;
//	}
//}
//
//
//void test1()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//
//int main()
//{
//	//test1();
//	struct Stu s[] = { {"zhangsan",29},{"lisi",39},{"wangwu",10}};
//	size_t sz = sizeof(s) / sizeof(s[0]);
//	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//
//	return 0;
//}



//九九乘法表正三角
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 1; j <= i; j++)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}



//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 9; j >= i; j--)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}


//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i<= 5; i++)
//	{
//		for (j = 1; j <= 5 - i; j++)
//			printf(" ");
//		for (j = 1; j <= 7; j++)
//			printf("#");
//		printf("\n");
//	}
//	return 0;
//}



//void reverse(int* nums, int left, int right)
//{
//    while (left < right)
//    {
//        int tmp = *(nums + right);
//        *(nums + right) = *(nums + left);
//        *(nums + left) = tmp;
//        left++;
//        right--;
//    }
//}
//
//
//
//void rotate(int* nums, int numsSize, int k) {
//
//    //1.
//    // int j=0;
//    // for(j=0;j<k;j++)
//    // {
//    //     int tmp = nums[numsSize-1];
//
//    //     for(int i = numsSize-2 ;i>=0;i--)
//    //     {
//    //         nums[i+1]=nums[i];
//
//    //     }
//    //     nums[0]=tmp;
//    // }
//
//    int left = 0;
//    int right = numsSize - 1;
//    reverse(nums, left, right - k);
//    reverse(nums, right - k + 1, right);
//    reverse(nums, left, right);
//}
//
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7 };
//    rotate(arr, 7, 3);
//    int i = 0;
//    for (i = 0; i < 7; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}





//2023.10.22

//void Find_single_dog2(int* arr, size_t sz, int* ps1, int* ps2)
//{
//	//1.全部异或在一起
//	int i = 0;
//	int r = 0;
//	for (i = 0; i < sz; i++)
//	{
//		r ^= arr[i];
//	}
//	//2.分组
//	int pos = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((r >> i) & 1) == 1)
//		{
//			pos = i;
//			break;
//		}
//	}
//	//3.分别异或
//	for (i = 0; i < sz; i++)
//	{
//		if (((arr[i] >> pos) & 1) == 1)
//		{
//			*ps1 ^= arr[i];
//		}
//		else
//		{
//			*ps2 ^= arr[i];
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	int s1 = 0;
//	int s2 = 0;
//	Find_single_dog2(arr, sz,&s1,&s2);
//	printf("%d %d", s1, s2);
//	return 0;
//}



//模拟atoi库函数

//enum
//{
//	VALID,
//	INVALID
//}sta= INVALID;//这里写成了VALID
//
//
//int my_atoi(const char* str)
//{
//	//空指针
//	assert(str);
//	//空字符串
//	if (*str == '\0')
//	{
//		return 0;
//	}
//	//空格
//	while (isspace(*str))
//	{
//		str++;
//	}
//	//+-
//	int flag = 1;
//	if (*str == '+')
//	{
//		flag = 1;
//		str++;
//	}
//	else if (*str == '-')
//	{
//		flag = -1;
//		str++;
//	}
//	//剩下的情况默认为正数
//	//.....
//
//
//	//正常情况
//	long long r = 0;
//	while (*str)
//	{
//		if (isdigit(*str))
//		{
//			r = r * 10 + flag * (*str - '0');//这里不是'\0'
//			if (r > 2147483647 || r < -2147483647)
//			{
//				if (flag == 1)
//				{
//					return 2147483647;
//				}
//				else
//				{
//					return -2147483647;
//				}
//			}
//			str++;
//		}
//		else
//		{
//			return (int)r;
//		}
//	}
//	sta = VALID;
//	return (int)r;
//}
//
//
//int main()
//{
//	//char arr[] = "abcdejg1881";
//	//char arr[] = "1882384848838838838383883";
//	//char arr[] = "-1183746586318681493888343";
//	//char arr[] = "-183384";
//	//char arr[] = "   aihfii8188";
//	//char arr[] = "-19383ahduda1838";
//	char arr[] = "111111";
//	int ret = my_atoi(arr);
//	if (sta == VALID)
//	{
//		printf("合法的转换: %d\n",ret);
//	}
//	else
//	{
//		printf("非法的转换: %d\n", ret);
//	}
//	return 0;
//}



//编号=地址=代码
//int main()
//{
//	int a = 0;
//	int* pa = &a;
//	*pa = 18;
//	printf("%d\n", a);
//	return 0;
//}



//嵌套循环打印图案
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 5; i++)
//	{
//		for (j = 1; j <= 5 - i; j++)
//			printf(" ");
//		for (j = 1; j <= 7; j++)
//			printf("#");
//		printf("\n");
//	}
//	return 0;
//}



//九九乘法表正三角形版本
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 1; j <= i; j++)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}


//倒三角形版本
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 9; j >= i; j--)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}



//逆置字符串

//void reverse(char* str, size_t sz)
//{
//	size_t left = 0;
//	size_t right = sz - 2;
//	while (left < right)
//	{
//		char tmp = *(str + left);
//		*(str + left) = *(str + right);
//		*(str + right) = tmp;
//		left++;
//		right--;
//	}
//}
//
//
//int main()
//{
//	char arr[] = "abcdefghijklmn";
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	reverse(arr, sz);
//	printf("%s\n", arr);
//	return 0;
//}



//二分查找
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	int k = 0;
//	printf("请输入你要查找的数字\n");
//	scanf("%d", &k);
//	int flag = 0;
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (*(arr + mid) < k)
//		{
//			right = mid - 1;
//		}
//		else if(*(arr+mid)>k)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			printf("找到了，下标是%d\n", mid);
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}



//冒泡排序
//void swap(int* buf1, int* buf2)
//{
//	int tmp = *buf1;
//	*buf1 = *buf2;
//	*buf2 = tmp;
//}
//
//void bubble_sort(int* arr, size_t sz)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int exchange = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (*(arr + j) > *(arr + j + 1))
//			{
//				exchange = 1;
//				swap(arr + j, arr + j + 1);
//			}
//		}//看本质，因为内层循环是在比较两个数之间的大小关系，那么肯定得两两都得比一下，才能排完
//		if (exchange == 0)
//			break;
//	}
//}
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}




//指针数组
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6 };
//	int arr2[] = { 2,3,4,5,6,7 };
//	int arr3[] = { 3,4,5,6,7,8 };
//	int arr4[] = { 4,5,6,7,8,9 };
//	int* arr[] = { arr1,arr2,arr3,arr4 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 4; i++)
//	{
//		for (j = 0; j < 6; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}



//函数指针，回调函数

//void menu()
//{
//	printf("***************************************\n");
//	printf("****        1.add        2.sub     ****\n");
//	printf("****        3.mul        4.div     ****\n");
//	printf("****              0.exit           ****\n");
//	printf("***************************************\n");
//}
//
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//void calc(int(*pf)(int, int))
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int ret = pf(x, y);
//	printf("%d\n", ret);
//}
//
//
//int main()
//{
//	int input = 0;
//	do
//	{
//		menu();
//		printf("请选择>:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:calc(Add);
//			break;
//		case 2:calc(Sub);
//			break;
//		case 3:calc(Mul);
//			break;
//		case 4:calc(Div);
//			break;
//		case 0:printf("退出计算机\n");
//			break;
//		default:printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}



//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int (*pfarr[4])(int, int) = { Add,Sub,Mul,Div };
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int i = 0;
//	for (i = 0; i < 4; i++)
//	{
//		printf("%d\n", pfarr[i](x, y));
//	}
//	return 0;
//}




//模拟冒泡排序，排序通用类型

//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//
//
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
//
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//
//
//void swap(char* buf1, char* buf2, size_t size)//这里没有写循环
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		char tmp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
//
//void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int exchange = 0;
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base+j*size,(char*)base+(j+1)*size)>0)
//			{
//				exchange = 1;
//				//交换每个字节的内容
//				swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
//			}
//		}
//		if (exchange == 0)
//			break;
//	}
//}
//
//
//void test1()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//
//int main()
//{
//	//test1();
//	struct Stu s[] = { {"zhangsan",29},{"lisi",39},{"wangwu",10}};
//	size_t sz = sizeof(s) / sizeof(s[0]);
//	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//	return 0;
//}



//int main()
//{
//	printf("%s\n", __FILE__);
//	printf("%d\n", __LINE__);
//	printf("%s\n", __DATE__);
//	printf("%s\n", __TIME__);
//	return 0;
//}


//int main()
//{
//	char* p = "hello ""bit\n";
//	printf("hello"" bit\n");
//	printf("%s", p);
//	return 0;
//}

//#define PRINT(FORMAT, VALUE)\
// printf("the value of " #VALUE " is "FORMAT "\n", VALUE);
//
//
//int main()
//{
//	int i = 10;	
//	PRINT("%d", i + 3);
//	return 0;
//}

//#define ADD_TO_SUM(num, value) \
// sum##num += value;
//
//int main()
//{
//	int sum10 = 5;
//	ADD_TO_SUM(10, 10);
//	printf("%d\n", sum10);
//	return 0;
//}

//#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
//
//int main()
//{
//	int x = 5;
//	int y = 8;			  //	6      9				9/10
//	int z = MAX(x++, y++);//( (x++) > (y++) ? (x++) : (y++) )
//	printf("x=%d y=%d z=%d\n", x, y, z);
//	return 0;				// 6  10 9
//}


//#define MAX 100
//
//int main()
//{
//	printf("%d\n", MAX);
//#undef MAX
//	printf("%d\n",MAX)
//	return 0;
//}



//int main()
//{
//
//#if 5<3
//	printf("haha\n");
//#endif
//
//	return 0;
//}


//#define MAX 3
//int main()
//{
//#if  MAX==1
//	printf("haha\n");
//#elif MAX==2
//	printf("hehe\n");
//#else MAX==3
//	printf("xixi\n");
//#endif
//	return 0;
//}


//#define MAX 100
//int main()
//{
//#if defined MAX
//	printf("haha\n");
//#endif
//
//#if !defined MAX
//	printf("hehe\n");
//#endif
//	return 0;
//}
//
//
//
//
//int main()
//{
//#ifdef MAX
//	printf("haha\n");
//#endif
////********************
//#ifndef MAX
//	printf("hehe\n");
//#endif
//	return 0;
//}




//#define A 1
//#define B 0
//#define C 0
//#define D 1
//
//int main()
//{
//#ifdef  A
//	#if defined B
//	printf("haha\n");
//	#elif defined C
//	printf("hehe");
//	#endif
//#elif B 
//	#ifdef C 
//	printf("hehe\n");
//	#endif
//	#ifdef D
//	printf("xixi\n");
//	#endif
//#endif
//	return 0;
//}

//#ifndef __STDIO_H__
//#define __STDIO_H__
////头文件的内容
//#endif   //__STDIO_H__




//2023.10.23
//编号=地址=指针
//int main()
//{
//	int a = 0;
//	int* pa = &a;
//	*pa = 18;
//	printf("%d\n", a);
//	return 0;
//}




//嵌套循环打印图案
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 5; i++)
//	{
//		for (j = 1; j <= 5 - i; j++)
//			printf(" ");
//		for (j = 1; j <= 7; j++)
//			printf("#");
//		printf("\n");
//	}
//	return 0;
//}



//九九乘法表正三角形版本
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 1; j <= i; j++)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}



//倒三角形版本
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i <= 9; i++)
//	{
//		for (j = 9; j >= i; j--)
//			printf("%d*%d=%d ", i, j, i * j);
//		printf("\n");
//	}
//	return 0;
//}




//int* Find_single_dog2(int* arr, size_t size, int* returnSize)
//{
//	//1.全部异或在一起
//	int i = 0;
//	int r = 0;
//	for (i = 0; i < size; i++)
//	{
//		r ^= arr[i];
//	}
//	//2.分组
//	int pos = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((r >> i) & 1) == 1)
//		{
//			pos = i;
//			break;
//		}
//	}
//	//3.分别异或
//	int s1 = 0;
//	int s2 = 0;
//	for (i = 0; i < size; i++)
//	{
//		if (((arr[i] >> pos) & 1) == 1)
//		{
//			s1 ^= arr[i];
//		}
//		else
//		{
//			s2 ^= arr[i];
//		}
//	}
//	int* ptr = (int*)malloc(2 * sizeof(int));
//	if (ptr == NULL)
//	{
//		perror("ptr::");
//		exit(-1);
//	}
//	*returnSize = 2;
//	ptr[0] = s1;
//	ptr[1] = s2;
//	return ptr;
//}
//
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	int returnSize = 0;
//	int* ptr = Find_single_dog2(arr,sz,&returnSize);
//	int i = 0;
//	for (i = 0; i < returnSize; i++)
//	{
//		printf("%d ", ptr[i]);
//	}
//	return 0;
//}




//模拟atoi


//enum
//{
//	VALID,
//	INVALID
//}sta=INVALID;
//
//
//
//int my_atoi(const char* str)
//{
//	//空指针
//	assert(str);
//	//空字符串
//	if (*str == '\0')
//	{
//		return 0;
//	}
//	//空格
//	while (isspace(*str))
//	{
//		str++;
//	}
//	//+-
//	int flag = 1;
//	if (*str == '+')
//	{
//		flag = 1;
//		str++;
//	}
//	else if (*str == '-')
//	{
//		flag = -1;
//		str++;
//	}
//	//......
//	//正常情况
//	long long r = 0;
//	while (*str)
//	{
//		if (isdigit(*str))
//		{
//			r = r * 10 + flag * (*str - '0');
//			if (r > 2147483647 || r < -2147483647)
//			{
//				if (flag == 1)
//				{
//					return 2147483647;
//				}
//				else
//				{
//					return -2147483647;
//				}
//			}
//			str++;
//		}
//		else
//		{
//			return (int)r;
//		}
//	}
//	sta = VALID;
//	return (int)r;
//
//}
//
//
//int main()
//{
//	char arr[] = "abcdejg1881";
//	//char arr[] = "1882384848838838838383883";
//	//char arr[] = "-1183746586318681493888343";
//	//char arr[] = "-183384";
//	//char arr[] = "   aihfii8188";
//	//char arr[] = "-19383ahduda1838";
//	//char arr[] = "111111";
//	int ret = my_atoi(arr);
//	if (sta == INVALID)
//	{
//		printf("非法的转换:%d\n", ret);
//	}
//	else
//	{
//		printf("合法的转换:%d\n", ret);
//	}
//
//	return 0;
//}




//二分查找

//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int left = 0;
//	int right = sz - 1;
//	int k = 0;
//	printf("请输入你要找的数字\n");
//	scanf("%d", &k);
//	int flag = 0;
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (*(arr + mid) < k)
//		{
//			right = mid - 1;
//		}
//		else if(*(arr+mid)>k)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			printf("找到了，下标是%d\n", mid);
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}



//逆置字符串

//void reverse(char* str, size_t sz)
//{
//	size_t left = 0;
//	size_t right = sz - 2;
//	while (left < right)
//	{
//		char tmp = *(str + left);
//		*(str + left) = *(str + right);
//		*(str + right) = tmp;
//		left++;
//		right--;
//	}
//}
//
//
//int main()
//{
//	char arr[] = "abcdefghijklmn";
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	reverse(arr, sz);
//	printf("%s\n", arr);
//	return 0;
//}



//void swap(int* part1, int* part2)
//{
//	int tmp = *part1;
//	*part1 = *part2;
//	*part2 = tmp;
//}
//
//void bubble_sort(int* arr, size_t sz)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int exchange = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			if (*(arr + j) > *(arr + j + 1))
//			{
//				exchange = 1;
//				swap(arr + j, arr + j + 1);
//			}
//		}
//		if (exchange == 0)
//			break;
//	}
//}
//
//int main()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}



//字符串相关函数


//strchr

//字符串相关函数
//char* my_strchr(const char* str, int character)
//{
//	assert(str);
//	while (*str)
//	{
//		if (*str == character)
//		{
//			return (char*)str;
//		}
//		str++;
//	}
//	return NULL;
//}
//
////strlen
//int my_strlen(const char* str)
//{
//	assert(str);
//	int count = 0;
//	while (*str++ != '\0')
//	{
//		count++;
//	}
//	return count;
//}
//
////strcpy
//char* my_strcpy(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
////strcmp
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//		str1++;
//		str2++;
//	}
//	return *str1 - *str2;
//}
//
//
////strcat
//
//char* my_strcat(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//	while (*dest != '\0')
//	{
//		dest++;
//	}
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//
//char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	const char* s1 = str1;
//	const char* s2 = str2;
//	const char* p = str1;
//	while (*p)
//	{
//		s1 = p;
//		s2 = str2;
//		while (*s1 && *s2 && *s1 == *s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//		{
//			return (char*)p;
//		}
//		p++;
//	}
//	return NULL;
//}
//
//int main()
//{
//	char arr1[30] = "abcdefghijklmn";
//	char arr2[] = "defghijk";
//	//printf("%s\n", my_strchr(arr1, 'f'));
//	//printf("%d\n", my_strlen(arr2));
//	//printf("%s\n", my_strcpy(arr1, arr2));
//	//printf("%d\n", my_strcmp(arr1, arr2));
//	//printf("%s\n", my_strcat(arr1, arr2));
//	printf("%s\n", my_strstr(arr1, arr2));
//	return 0;
//}




//函数指针，回调函数

//void menu()
//{
//	printf("****************************************\n");
//	printf("*****       1.add         2.sub     ****\n");
//	printf("*****       3.mul         4.div     ****\n");
//	printf("*****              0.exit           ****\n");
//	printf("****************************************\n");
//}
//
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void calc(int(*pf)(int, int))
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int ret = pf(x, y);
//	printf("%d\n", ret);
//
//}
//
//
//int main()
//{
//	int input = 0;
//	do
//	{
//		menu();
//		printf("请选择:>");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:calc(Add);
//			break;
//		case 2:calc(Sub);
//			break;
//		case 3:calc(Mul);
//			break;
//		case 4:calc(Div);
//			break;
//		case 0:printf("退出计算机\n");
//			break;
//		default:printf("选择错误，请重新选择\n");
//			break;
//		}
//	} while (input);
//	return 0;  
//}


//函数指针数组
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int(*pfarr[4])(int, int) = { Add,Sub,Mul,Div };
//	printf("请输入两个操作数\n");
//	scanf("%d %d", &x, &y);
//	int i = 0;
//	for (i = 0; i < 4; i++)
//	{
//		printf("%d\n", pfarr[i](x, y));
//	}
//	return 0;
//}



//模拟冒泡排序，排序通用类型
//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}
//
//
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
//}
//
//void swap(char* buf1, char* buf2, size_t sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		char tmp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
//
//void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int exchange = 0;//做个标记
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
//			{
//				exchange = 1;//如果需要交换的话，就赋值为1
//				//交换每个字节的内容
//				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
//			}
//		}
//		if (exchange == 0)
//			break;
//	}
//}
//
//
//
//void test1()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//
//int main()
//{
//	//test1();
//	struct Stu s[] = { {"zhangsan",29},{"lisi",39},{"wangwu",10}};
//	size_t sz = sizeof(s) / sizeof(s[0]);
//	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//	return 0;
//}



//memmove

//void* my_memmove(void* dest,const void* src,size_t size)
//{
//	assert(dest && src);
//	void* ret = dest;
//	if (dest < src)
//	{
//		while (size--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else
//	{
//		while (size--)
//		{
//			*((char*)dest + size) = *((char*)src + size);
//		}
//	}
//	return ret;
//}
//
//
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr + 3, arr, 20);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}



int main()
{
	
	return 0;
}